注:本文出自《How to DeFi:Advanced》第Ⅳ部分第15章。作者包括Lucius Fang, Benjamin Hor, Erina Azmi以及 Khor Win Win。
《How to DeFi:Advanced》是CoinGecko出版的DeFi经典读物《How to DeFi》的进阶版。此书可通过官网或亚马逊购买,也可通过累积CoinGecko 积分换购,要求积分为800个。
为了能更好的传播DeFi相关知识,巴比特将持续对全书进行翻译。以下是《第15章:DeFi的漏洞利用》的全部编译内容。
探索DeFi是有风险的;智能合约黑客攻击也一直在发生。仅2020年,就有至少12次高调的DeFi黑客攻击,从DeFi协议中抽走了不少于1.21亿美元的资金。
来源:CoinGecko 2020年度报告
没有人可以完全预测已部署的智能合约会发生什么,即使是最好的智能合约审计师。由于智能合约上有数十亿美元的资金,所以可以肯定的是,最聪明的黑客正在不断寻找利用安全弱点并从中获利。
DeFi的巨大风险在于,随着项目利用DeFi的可组合性并在其基础上进行构建,DeFi应用的复杂性成倍增加,使智能合约审计人员更难发现弱点。DeFi应用程序开发人员必须确保网络安全审计人员不断检查他们的代码,以减少任何利用的可能性,因为错误的后果将是巨大的经济损失。
在本章中,我们将探讨黑客攻击的原因、闪电贷款、减少黑客攻击损失的潜在解决方案,以及个人避免在DeFi漏洞中损失资金的一些提示。
漏洞的原因
下面我们将阐述一些常见的漏洞原因,但该清单并不详尽,不代表所有原因。
1. 经济剥削/闪电贷
闪电贷允许用户利用几乎无限的资本来进行金融交易,只要借款人在同一交易中偿还贷款即可。这是一个强大的工具,使人能够操纵过去受资本要求限制的经济攻击。有了闪电贷,拥有正确的策略就是利用机会的唯一要求。
几乎所有的DeFi黑客都利用了闪电贷。我们将在下一节对其进行更详细的研究。
2. 生产文化中的代码
由Yearn Finance的创始人Andre Cronje带头,许多DeFi项目都遵循生产中测试的精神以加快产品开发的步伐,而不是最大限度地提高安全性和测试。因为对每个版本进行审计将大大延长将任何产品更新推向市场所需的时间。
DeFi的主要竞争优势之一是,开发人员可以更快地进行迭代,突破金融创新的界限。然而,并不是每个项目都有能力进行审计,尤其是在项目尚未取得任何进展的时候。尽管有多次审计,黑客仍然可以设法利用一些项目,也就是说,即使有审计也可能不足以防止所有黑客。
3. 草率的编码和不充分的审计
在牛市中,许多项目团队感到有压力,需要快速行动,走捷径以更快地发布他们的产品。有些人甚至可能决定完全跳过审计,以获得先发优势,并在产品上线几个月后才进行审计。
此外,还有大量的"分叉"--使用与其他成熟项目相同代码的新项目。在没有完全了解代码如何工作的情况下启动,它们被当作是快速抢钱的工具,导致了许多漏洞。
4. 卷钱跑路 Rug Pull(内部工作)
在DeFi领域,以匿名团队启动项目的情况并不少见。由于监管环境不确定,一些人这样做是为了避免监管机构的审查。然而,其他人选择匿名,是因为他们心怀恶意。许多例子表明,匿名团队进行了内部工作,并故意留下一个漏洞,然后利用这个漏洞窃取毫无戒心的用户。
在看到第一个加密货币比特币也是由一个不知名的人创立后,加密货币社区并不疏远由匿名创始人发起的项目。用户根据产生的代码来评估项目,而不是开发人员是谁或来自哪里。这与开放软件的去中心化精神是一致的。
撇开理想不谈,如果在一个匿名团队发起的协议发生漏洞,那么由于很难找到开发者的真实身份,没有追索权的可能性就会很大。
5. 预言机攻击
DeFi协议需要知道资产价格才能正确运作。例如,一个借贷协议需要知道资产价格,以决定是否清算借款人的头寸。
因此,作为DeFi基础设施不可缺少的一部分,预言机可能会受到严重的操纵。例如,我们在第12章中提到,MakerDao的金库被利用后,造成了不必要的金库清算,造成了总价值超过800万美元的ETH损失。
6. Metamask(狐狸钱包)攻击
作为每个以太坊应用程序的主要界面,Metamask成为主要攻击目标并不奇怪。但Consensys团队在安全方面做得很彻底,到目前为止,还没有出现大范围的漏洞。
然而,有几起引人注目的袭击事件:
通过EasyFi项目的管理员MetaMask账户损失5900万美元通过Nexus Mutual创始人的个人钱包损失800万美元
闪电贷
什么是闪电贷?
闪电贷是指用户可以在没有任何抵押物的情况下借入资金,只要用户在同一交易中偿还贷款即可。如果用户没有在同一笔交易中偿还闪电贷款,那么交易将自动失败,并产生交易费用的损失,以确保闪电贷不会发生。闪电贷款是由各种DeFi协议提供的,如Aave和dYdX。
与普通贷款相比,闪电贷有三个主要特点:
没有违约风险:闪电款在同一笔交易中偿还。因此,没有违约风险。无抵押品:借款人只要能在一次交易中偿还贷款,就可以在不提供任何抵押品或信用检查的情况下获得贷款。无限的贷款规模:用户可以从DeFi协议中借到任何数额的资金,但不超过可用的总流动资金。
截至2021年4月,闪电贷的执行并不友好,因为你必须通过编写智能合约代码来执行它。因此,它更适合于软件程序员,而不是一般的门外汉。
事实上,一些程序员经常利用这一因素,发起我们所说的 "闪电贷攻击",特别是在不需要抵押物的情况下。最著名的闪电贷款攻击之一发生在Harvest Finance,造成了2400万美元的损失。
下表显示了提供闪电贷的主要协议所产生的费用。
闪电贷的使用
下图显示了Aave的所有闪电贷的使用构成。
我们可以看到,闪电贷主要用于套利目的。套利是指利用市场之间的价格差异来赚取利润的行为。例如,假设我们发现WBTC在两个不同的去中心化交易所有相当大的价格差异。我们可以使用闪电贷款,在没有任何抵押的情况下借入大量的WBTC,从价格差异中获利。
闪电贷的第二个用途是用于贷款清算。如果借款人让协议清算他们的头寸,通常会有罚款。当市场有实质性的价格行动时,借款人可以选择获得闪电贷并自行清算他们的头寸,从而避免惩罚性费用。
让我们看一个例子,我们用ETH作为抵押品向Maker借DAI。当ETH的价格大幅下跌时,它可能会接近我们DAI贷款的清偿水平。我们可能没有ETH来增加我们的抵押品,也没有DAI来偿还贷款。我们可以做的是采取DAI闪电贷来偿还Maker贷款。然后我们可以将提取的部分ETH抵押品换成DAI来即时偿还闪电贷。使用这种方法,我们将保留剩余的ETH,而无需支付清算罚款。
最后,闪电贷也可以用来执行抵押品互换。例如,如果我们在Compound上有一笔DAI贷款,以ETH作为抵押品,我们可以使用闪电贷将ETH抵押品换成WBTC抵押品。这使我们能够轻松地改变我们的风险状况,而不需要通过多次交易。
执行闪电贷仍然需要相当多的技术知识,对那些不知道如何编码的人来说有很高的进入门槛。然而,有一个第三方应用程序可以使普通用户也能执行闪电贷--这个平台被称为Furucombo。
闪电贷协议:Furucombo
Furucombo是一个允许任何人使用闪电贷创建套利策略的平台。由于它的拖放工具使终端用户能够建立和定制不同的DeFi组合,组装资金杠杆的门槛也就降低了。请注意,Furucombo不会为你寻找套利机会。
要使用Furucombo,用户需要设置输入/输出和交易的顺序,它将把所有的Cube捆绑成一个交易来执行。下面是一个如何进行套利交易的例子:
从Aave获得15,000DAI的闪电贷。使用1nch将DAI换成yCRV。用Curve将yCRV换回DAI。由于价格差异,你最终得到了15,431个DAI,比以前多了1个DAI。包括Aave的闪电贷费用在内的15,013DAI的贷款金额被偿还给Aave。用户剩下的利润为418DAI。所有这些步骤都在一次交易中执行。
Furucombo不需要任何预付资金,也不收取费用,用户可以在平台上使用闪电贷建立 "组合 "并进行套利交易。你所需要的是钱包里的ETH,用来支付gas费。
建议用户自行承担交易风险,因为Furucombo上并不总是有套利机会,如果价格差异不再存在,组合可能会失败。无论结果如何,用户都将面临支付交易费用的风险。
案例研究:bZx闪电贷攻击
2020年2月15日,以太坊区块链上发生了一笔在当时被认为是独一无二的交易。在一个区块内,在不到一分钟的时间里,一笔交易实现了约36万美元的利润。
这项交易引起了加密货币社区的注意,并被广泛分析。88该收益是通过最初的几乎无风险的闪电贷形式实现的,随后在不同的去中心化交易所之间进行了一系列套利。
来源:Peckshield
闪电贷借贷:首先,从dYdX那里获得了10,000ETH的闪电贷款。囤积:这些ETH的一半(5,500ETH)被质押在Compound上作为抵押品,以借入112个WBTC。拉高保证金:1,300个ETH存入bZx,使用5倍杠杆做空ETH,以支持WBTC。从bZx借出的5,637个ETH被用来用KyberSwap换取51个BTC。根据KyberSwap算法,最好的价格是由Uniswap提供。然而,由于流动性低,交易推动了1 WBTC的汇率上升到109.8 WETH左右,大约是该期间正常转换率的三倍。抛售:攻击者在价格上涨后在Uniswap卖出了借来的112个WBTC,获得了6,871个ETH,转换率为1WBTC=61.2WETH。闪电贷利润:用未使用的3,200ETH和出售的6,871ETH,攻击者偿还了10,000ETH的闪电贷款,利润为71ETH。利润总额:Compound头寸仍然处于盈利状态。由于1个WBTC的平均市场价格为38.5WETH,攻击者可以用大约4,300ETH获得112个WBTC。总的来说,攻击者获得了71 WETH + 5,500 WETH - 4,300 ETH = 1,271 ETH,大概是355,880美元。(假设ETH价格为280美元)
上述事件不仅证明了通过操纵其他资产的价格获得极端资本收益的可能性,而且除了相对较低的协议费,借款人也没有其他费用。借款人面临的唯一条件是,贷款要在同一笔交易中偿还。因此,无抵押贷款的概念本身就为该领域带来了广泛的机会。
闪电贷总结
闪电贷可能是一把双刃剑。一方面,它对智能合约的新颖使用给DeFi生态系统带来了便利和进步--没有多少资本的交易者可以利用闪电贷款启动套利和清算策略,而不需要大量的资本基础。
另一方面,黑客可以利用闪电贷款发起闪电贷款攻击,由于不需要抵押品,所以大大增加了他们的利润。就像任何工具一样,闪电贷可以用于好的和坏的目的。
在我们看来,被恶意利用的闪电贷攻击加强了整个DeFi生态系统,因为项目改善了他们的基础设施,以防止未来攻击的发生。由于闪存贷仍处于新生阶段,这些攻击可以被视为一线生机,缓解了DeFi生态系统种使其更加脆弱的漏洞。
解决方案
仅有智能合约的审计并不足以防止漏洞。项目需要做得更多,他们现在正在寻找替代方案,以确保存放在其协议中的资金安全。以下是一些可能的解决方案:
内部保险基金
有几个项目已经决定使用他们的本地代币作为风险支撑。这方面的例子包括:
Maker在黑色星期四铸造了MKR,以弥补DAI的清算缺口。Aave推出了stAAVE,以弥补储户的任何潜在亏空。YFI抵押了他们的代币,并借入DAI来偿还黑客的资金。
保险
作为该领域的新生力量之一,Unslashed Finance向LIDO和Paraswap的用户提供了协议级别的保险,从而为协议为其用户购买保险提供了可能性。
漏洞赏金
越来越多的项目利用Immunefi来列出漏洞赏金,91鼓励黑客通过发现漏洞而不是利用漏洞来获得奖励。最高的赏金可以达到150万美元。然而,由于黑客的潜在回报较高,这是否能阻止黑客的发展还有待观察。
其他可能的解决方案
全行业的保险库
可以有一个全行业的保险池,每个DeFi协议都从他们的收入中拿出一部分或支付固定费用。当其中一个成员遭遇黑客攻击时,该保险池预计将支付索赔。这类似于联邦存款保险公司(FDIC)的想法。
审计员要参与游戏
这个想法建议审计师在DeFi保险平台上质押,如Nexus Mutual。作为质押者,如果协议被黑,那么审计师将遭受损失。这种实施方式有望使审计师和项目的利益一致。
给个人的提示
除了智能合约黑客,你也可能会受到各种黑客的攻击。以下是你可以采取的一些步骤,以尽量减少风险,降低被黑客攻击的几率。
不要给智能合约以无限的批准
与DeFi协议互动,通常需要你给智能合约访问权,并同意花费你钱包里的资金。通常,为了方便起见,DeFi协议要求将默认的批准设置为无穷大,这意味着该协议可以无限制地访问你钱包中的批准资产。
给予你的钱包无限制的批准来花费批准的资产通常是一个坏主意,因为一个恶性的智能合约可能会利用这一点从你的钱包中抽走资金。
2021年2月27日,一名黑客使用了一个假的智能合约,并欺骗Furuсombo,使其认为Aave v2有一个新的实现。这次攻击利用了具有无限代币批准权的大型钱包,并通过将资金转移到黑客控制的地址来耗尽这些钱包。
在这次攻击中,Furucombo的用户遭遇了总额高达1500万美元的损失。92 即使是贷款协议,Cream Finance,也犯了无限制审批的错误,在这次攻击中,金库损失了110万美元。
因此,手动更改每笔交易的批准金额是一个好主意,以防止在代币批准期间给予DeFi协议无限的支出权限。即使这将导致后续每次DeFi交互的额外交易,并产生更高的交易费用,但可以减少钱包在智能合约利用攻击中被耗尽的风险。
要手动改变批准的金额,请按照下面的步骤进行操作:
步骤1
需要批准的最常见的情况之一是兑换。在这个例子中,我们计划在Uniswap上将15.932 SNX换成0.0834 ETH。点击 "批准SNX"
步骤2
左边的图片是我们将看到的默认窗口。点击 "查看完整的交易细节".然后我们就会看到右图。点击 "编辑"。
步骤3
选择 "自定义支出限额"。很多应用程序在默认情况下选择 "无限 "选项。键入我们想要花费的金额,在这个例子中,即15.932 SNX。
步骤4
在 "许可 "部分,我们可以看到,数字是更新的。点击 "确认 "并支付交易费。
撤销智能合约的无限批准
如果你之前给了DeFi协议无限的支出批准,那么你有两个选择。更简单的选择是将你的所有资金转移到一个新的以太坊地址,你将获得一个新的重新开始,而不承担任何与你以前的以太坊地址相关的风险。
然而,如果不可能将资金从现有的以太坊地址中转移出来,你可以使用Etherscan提供的代币审批工具检查所有以前的审批清单。
在这个页面,你可以看到你以前授予智能合约的所有批准。你应该撤销所有批准金额无限的批准,特别是你不再交互的协议。请注意,撤销每个批准需要智能合约本身的交互,并将产生交易费用。
使用硬件钱包
硬件钱包是一个专门用于存储加密货币的物理设备。硬件钱包将私钥与互联网连接的设备分开,以减少钱包被破坏的机会。
在硬件钱包中,私钥被保存在一个安全的离线环境中,即使硬件钱包被插入感染了恶意软件的电脑中。虽然硬件钱包可以被物理盗窃,但如果小偷不知道你的密码,它就无法进入。如果你的硬件钱包不幸损坏或被盗,如果你在丢失之前创建了一个秘密的备份代码,你仍然能够恢复你的资金。
尽管有更多的人已经开始进入硬件钱包制造商行业,但目前顶级的硬件钱包制造商还是Ledger和Trezor。
使用独立的浏览器配置文件
虽然浏览器扩展是有帮助的,使你在工作中更有效率和生产力,但你应该始终担心恶意的浏览器扩展会给你的加密货币体验带来麻烦。
如果你不小心安装了一个恶意的浏览器扩展,它可能会窥探你的Metamask密钥,并成为你资金的攻击媒介。提高安全性的一个方法是在谷歌浏览器或Brave浏览器上创建一个单独的浏览器配置文件。在这个新的浏览器配置文件中,只安装Metamask扩展。通过这样做,你可以减少恶意浏览器扩展从你的钱包抽走资金的风险。
以下是在谷歌浏览器上创建新的浏览器配置文件的分步指南。
步骤1
打开Chrome浏览器进入上述页面。点击"添加"。或者你可以到右上角,点击配置文件图标。点击最底部的“+添加”。
步骤2
选择名称和颜色。然后点击 "完成"。
步骤3
如果你有一个不同的Chrome账户,请登录。如果没有,只需点击 "开始"。
步骤4
下载Metamask扩展,并使其成为此配置文件中的唯一扩展。
5
总结
DeFi领域在很大程度上仍然是各种金融创新的试验场。因此,事情可能也会出错。请注意使用新的DeFi应用程序的风险,特别是那些没有经过实战考验的应用程序。
在使用任何DeFi协议之前一定要做研究。在大多数情况下,一旦发生错误,对所造成的损失是无法追索的。即使在协议赔偿的情况下,损失通常也会超过收到的赔偿金额。
也就是说,由于涉及的风险,参与DeFi活动的收益很高。为了不错过DeFi提供的高收益,你可以选择通过购买保险或看跌期权来对冲一些风险。
DeFi领域仍在不断成熟。随着我们的发展,我们预计会有更多的DeFi协议推出,并将更好的保障措施和保险基金纳入其运营模式中。
推荐阅读
让Metamask成为你自己的银行 https://consensys.net/blog/metamask/metamask-secret-seed- phrase-and-password-management/如何(不)Rekt - DeFi黑客解释 https://finematics.com/defi-hacks-explained/DeFi安全:这么多的黑客,它能安全吗?https://unchainedpodcast.com/defi-security-with-so-many-hacks- will-it-ever-be-safe/ 关于黑客和漏洞的新闻 https://www.rekt.news/